Moleculer Runner 是一個輔助腳本,它可以幫你管理 Moleculer 服務。有了它,你就不用自己建立帶有選項的 ServiceBroker 實例,只要在根目錄新增一個 moleculer.config.js 配置檔,將 Broker 的選項寫在文件內即可。使用時僅需在 npm 腳本中加入 moleculer-runner 來執行,它就會自動載入配置檔,然後創建所有的 Broker 並載入服務。
你可以在配置檔中設定開發用的選項,然後將參數宣告為環境變數,如此一來就可以在生產環境中使用環境變數來替換參數值。
$ moleculer-runner [options] [service files or directories or glob masks]
這個語法只能在 npm 腳本上執行,如果你需要直接在主控台執行的話,請使用
./node_modules/.bin/moleculer-runner --repl或node ./node_modules/moleculer/bin/moleculer-runner.js --repl來執行。
| 名稱 | 類型 | 預設值 | 說明 |
|---|---|---|---|
-r, --repl |
Boolean |
false |
是否在 Broker 啟動後切換到 REPL 模式。 |
-s, --silent |
Boolean |
false |
禁用 Log 紀錄,主控台將不會顯示任何東西。 |
-H, --hot |
Boolean |
false |
服務改變時就 Hot Reload |
-c, --config <file> |
String |
null |
配置檔的路徑 |
-e, --env |
Boolean |
false |
從當前目錄的 .env 檔案讀取環境變數 |
-E, --envfile <file> |
String |
null |
從指定檔案讀取環境變數 |
-i, --instances |
Number |
null |
指定 Node 實例數量或是設定 max 使用完整 CPU 核心 |
範例:
{
"scripts": {
"dev": "moleculer-runner --repl --hot --config moleculer.dev.config.js services",
"start": "moleculer-runner --instances=max services"
}
}
dev腳本會讀取moleculer.dev.config.js配置檔,會啟動所有services目錄下的服務並開始 REPL 模式,如果服務改變時會 Hot Reload 。start腳本預設會讀取moleculer.config.js配置檔,如果檔案不存在的話則使用環境變數,接著會啟動所有services目錄下的服務。根據 CPU 數量啟動對應數量的 Broker 實例,最後啟動所有services目錄下的服務。
Runner 會根據以下步驟來讀取與合併配置:
MOLECULER_CONFIG 環境變數讀取配置檔,如果檔案不存在則會拋出錯誤。MOLECULER_CONFIG 存在則會被優先使用。moleculer.config.js 配置檔。如果不存在則會讀取 moleculer.config.json 檔案。ServiceBroker 的預設選項。logLevel: "warn" ,但是環境變數也定義了 LOGLEVEL=debug ,這時候 Runner 會覆蓋它變成 logLevel: "debug" 。假如你想在
.env環境變數中對不存在於配置檔的深層對象做設定,請使用MOL_作為前綴表示它是一個 Moleculer 的環境變數,以及雙底線__作為巢狀屬性分隔符號。例如要將cacher.options.prefix設為MOL,會是這樣宣告MOL_CACHER__OPTIONS__PREFIX=MOL。
配置檔的格式與 Broker 選項相同,每個屬性設定的名稱都相同。
範例:
moleculer.config.js
module.exports = {
nodeID: "node-test",
logger: true,
logLevel: "debug",
transporter: "nats://localhost:4222",
requestTimeout: 5 * 1000,
circuitBreaker: {
enabled: true
},
metrics: true
};
由於 Runner 也是一個 JS 程式,所以你可以使用異步的方式取得配置檔。這種情況下, moleculer.config.js 必須透過 Function 來返回一個 Promise 。
範例:
moleculer.config.js
const fetch = require("node-fetch");
module.exports = async function() {
const res = await fetch("https://pastebin.com/raw/SLZRqfHX");
return await res.json();
};
此函數跑在
MoleculerRunner實例且包含了thisContext,所以你可以透過 runner 取得flags資料。更多資訊請參閱 Runner 原始碼[2] 。
Runner 會將屬性名稱轉為大寫,如果有巢狀屬性則會將名稱轉為底線 _ 。
範例:
NODEID=node-test
LOGGER=true
LOGLEVEL=debug
# 速記 Transporter
TRANSPORTER=nats://localhost:4222
REQUESTTIMEOUT=5000
# 巢狀屬性
CIRCUITBREAKER_ENABLED=true
METRICS=true
Runner 會由 CLI 參數讀取檔案或服務目錄。你可以由 SERVICES 及 SERVICEDIR 環境變數來定義服務目錄,它會從指定的目錄及子目錄底下讀取所有的服務 **/*.service.js 。
Runner 會根據以下邏輯來讀取:
.env 內的 SERVICEDIR 存在,但是 SERVICES 不存在,它會由 SERVICEDIR 目錄讀取所有的服務。.env 內的 SERVICEDIR 與 SERVICES 同時存在,它會由 SERVICEDIR 目錄讀取指定的服務。.env 內的 SERVICEDIR 不存在,但是 SERVICES 存在,它會由當前的目錄讀取指定的服務。glob 匹配語法,則根據語意讀取找到的檔案。注意,縮寫的檔案名稱也可以作為
SERVICES參數被找到。
範例:在 services 目錄下讀取 math.service.js 、 post.service.js 與 user.service.js 服務。
SERVICEDIR=services
SERVICES=math,post,user
範例:在 services 目錄及子目錄讀取所有的 *.service.js 服務。
SERVICEDIR=my-services
如果你需要更多的方式,可以使用 glob 模式。它可以讓你很方便的來排除某些服務。
$ moleculer-runner services !services/others/**/*.service.js services/others/mandatory/main.service.js
說明:
services - 傳統方式。由 services 目錄下讀取 **/*.service.js 所有檔案。!services/others/**/*.service.js - 排除 services/others 目錄及子目錄的服務。services/others/mandatory/main.service.js - 載入指定的單一服務。
SERVICES環境變數也可以使用 glob。
Runner 內建了一個叢集函數,可以用來啟動多個 Broker 實例。
例如:以 4 個實例來啟動 services 目錄下的所有的服務。
$ moleculer-runner --instances 4 services
叢集節點 ID,如果你在選項中定義了節點 ID 為
my-node,當你啟動 4 個實例後,實例中的節點 ID 將會變成my-node-1、my-node-2、my-node-3與my-node-4。
Runner 可以在啟動時讀取 .env 檔案。你可以從兩個 CLI 選向來讀取 env 檔案。
-e, --env - 由當前目錄的 .env 檔案來讀取環境變數。-E, --envfile <filename> - 從指定路徑讀取環境變數檔案。範例:從當前目錄讀取 .env
$ moleculer-runner --env
範例:從指定路徑讀取 .env
$ moleculer-runner --envfile .my-env
[1] Moleculer Runner, https://moleculer.services/docs/0.14/runner.html
[2] Runner https://github.com/moleculerjs/moleculer/blob/master/src/runner.js